package com.itheima.tliasproject.service.impi;


import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.tliasproject.mapper.ClazzMapper;
import com.itheima.tliasproject.pojo.Clazz;
import com.itheima.tliasproject.pojo.ClazzQueryParam;
import com.itheima.tliasproject.pojo.PageResult;
import com.itheima.tliasproject.service.ClazzService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

@Slf4j
@Service
public class ClazzServiceImpI implements ClazzService {

    @Autowired
    private ClazzMapper clazzMapper;
    @Override
    public PageResult getAllclass(ClazzQueryParam clazzQueryParam) {
        //1.使用pagehelper分页插件
        PageHelper.startPage(clazzQueryParam.getPage(),clazzQueryParam.getPageSize());//得到接到的分页数据
        //在这里因为要展示班级状态 结课还是没有结课所以需要自己设置状态
        //2.调用mapper来查询数据
        List<Clazz> list = clazzMapper.list(clazzQueryParam);
        // 3. 获取当前日期（仅日期，无时间）
        LocalDate currentDate = LocalDate.now();

        // 4. 遍历课程，设置状态（增加空值判断和完整逻辑）
        for (Clazz clazz : list) {
            LocalDate beginDate = clazz.getBeginDate();
            LocalDate endDate = clazz.getEndDate();

            // 空值防御：若开始/结束日期为null，标记为“数据异常”
            if (beginDate == null || endDate == null) {
                clazz.setStatus("数据异常（日期缺失）");
                continue;
            }

            // 完整状态逻辑：
            if (currentDate.isBefore(beginDate)) {
                clazz.setStatus("未开班");
            } else if (currentDate.isAfter(endDate)) {
                clazz.setStatus("已结课");
            } else {
                clazz.setStatus("已开班");
            }
        }
        //进行数据类型转换因为我们要调用其中的方法
        Page p = (Page) list;
        PageResult pageResult = new PageResult(p.getTotal(),p.getResult());//这其中都是分页插件在帮我们进行处理数据，包括分页的数据以及需要返回的结果
        return pageResult;
    }

    //新增班级
    @Transactional
    public void updateclazz(Clazz clazz) {
        //补全缺失数据
        clazz.setCreateTime(LocalDateTime.now());
        clazz.setUpdateTime(LocalDateTime.now());
        //调用Mapper处理数据
        clazzMapper.updateclazz(clazz);

    }
//删除班级
    @Override
    public void deleteclazz(Integer id) {
        //在删除班级时先要确定该班级下是否有学生
        Integer studentcount = clazzMapper.count(id);
        log.info("班级学生人数：{}",studentcount);
        if (studentcount > 0){
            throw new RuntimeException("该班级下还存在学生不能删除");
        }
        else {
            clazzMapper.delete(id);
        }
    }
//根据id查询班级信息 回显
    @Override
    public Clazz selectById(Integer id) {
        return clazzMapper.selectById(id);
    }
//修改班级
    @Override
    public void update(Clazz clazz) {
        //补全数据

        clazz.setUpdateTime(LocalDateTime.now());
        clazzMapper.update(clazz);

        //根据传入的开课时间和结课时间进行判断课程状态
        LocalDate beginDate = clazz.getBeginDate();
        LocalDate endDate = clazz.getEndDate();
        if (beginDate == null || endDate == null) {
            clazz.setStatus("数据异常（日期缺失）");
        }
        LocalDate currentDate = LocalDate.now();
        if (currentDate.isBefore(beginDate)) {
            clazz.setStatus("未开班");
        } else if (currentDate.isAfter(endDate)) {
            clazz.setStatus("已结课");
        } else {
            clazz.setStatus("已开班");
        }
    }
//查询所有班级
    @Override
    public List<Clazz> list() {
        return clazzMapper.listall();
    }
}
